home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 742 / rkrm_lib2 / rkrm_lib2.lha / Exec_Library / DeviceIO / deviceuse.c < prev   
C/C++ Source or Header  |  1992-09-03  |  7KB  |  122 lines

  1. ;/* DeviceUse.c - Execute me to compile me with SAS C 5.10
  2. LC -b1 -cfistq -v -y -j73 DeviceUse.c
  3. Blink FROM LIB:c.o,DeviceUse.o TO DeviceUse LIBRARY LIB:LC.lib,LIB:Amiga.lib
  4. quit
  5.  
  6. /* DeviceUse.c - an example of using an Amiga device (here, serial device)    */
  7. /*    - attempt to create a message port with CreatePort()   (from amiga.lib) */
  8. /*    - attempt to create the I/O request with CreateExtIO() (from amiga.lib) */
  9. /*    - attempt to open the serial device with Exec OpenDevice()              */
  10. /*                                                                            */
  11. /* If successful, use the serial command SDCMD_QUERY, then reverse our steps. */
  12. /* If we encounter an error at any time, we will gracefully exit.  Note that  */
  13. /* applications which require at least V37 OS should use the Exec functions   */
  14. /* CreateMsgPort()/DeleteMsgPort() and CreateIORequest()/DeleteIORequest()    */
  15. /* instead of the similar amiga.lib functions which are used in this example. */
  16.  
  17. /*
  18. Copyright (c) 1992 Commodore-Amiga, Inc.
  19.  
  20. This example is provided in electronic form by Commodore-Amiga, Inc. for
  21. use with the "Amiga ROM Kernel Reference Manual: Libraries", 3rd Edition,
  22. published by Addison-Wesley (ISBN 0-201-56774-1).
  23.  
  24. The "Amiga ROM Kernel Reference Manual: Libraries" contains additional
  25. information on the correct usage of the techniques and operating system
  26. functions presented in these examples.  The source and executable code
  27. of these examples may only be distributed in free electronic form, via
  28. bulletin board or as part of a fully non-commercial and freely
  29. redistributable diskette.  Both the source and executable code (including
  30. comments) must be included, without modification, in any copy.  This
  31. example may not be published in printed form or distributed with any
  32. commercial product.  However, the programming techniques and support
  33. routines set forth in these examples may be used in the development
  34. of original executable software products for Commodore Amiga computers.
  35.  
  36. All other rights reserved.
  37.  
  38. This example is provided "as-is" and is subject to change; no
  39. warranties are made.  All use is at your own risk. No liability or
  40. responsibility is assumed.
  41. */
  42.  
  43. #include <exec/types.h>
  44. #include <exec/memory.h>
  45. #include <exec/io.h>
  46. #include <devices/serial.h>
  47.  
  48. #include <clib/exec_protos.h> /* Prototypes for Exec library functions */
  49. #include <clib/alib_protos.h> /* Prototypes for amiga.lib functions    */
  50.  
  51. #include <stdio.h>
  52.  
  53. #ifdef LATTICE
  54. int CXBRK(void) { return(0); }     /* Disable SAS CTRL/C handling */
  55. int chkabort(void) { return(0); }  /* really */
  56. #endif
  57.  
  58. void main(void)
  59. {
  60.     struct MsgPort  *serialMP;      /* for pointer to our message port */
  61.     struct IOExtSer *serialIO;      /* for pointer to our I/O request  */
  62.     struct IOExtSer *reply;         /* for use with GetMsg             */
  63.  
  64.     if (serialMP=CreatePort(NULL,NULL)) /* Create the message port. */
  65.     {
  66.         /* Create the I/O request. Note that <devices/serial.h> defines the type */
  67.         /* of IORequest required by the serial device--an IOExtSer. Many devices */
  68.         /* require specialized extended IO requests which start with an embedded */
  69.         /* struct IORequest. The generic Exec and amiga.lib device IO functions  */
  70.         /* are prototyped for IORequest, so some pointer casting is necessary.   */
  71.  
  72.         if (serialIO = (struct IOExtSer *)CreateExtIO(serialMP,sizeof(struct IOExtSer)))
  73.         {
  74.             /* Open the serial device (non-zero return value means failure here). */
  75.             if (OpenDevice( SERIALNAME, 0, (struct IORequest *)serialIO, 0L))
  76.                 printf("Error: %s did not open\n",SERIALNAME);
  77.             else
  78.             {
  79.                 /* Device is open */                         /* DoIO - demonstrates synchronous */
  80.                 serialIO->IOSer.io_Command  = SDCMD_QUERY;   /* device use, returns error or 0. */
  81.                 if (DoIO((struct IORequest *)serialIO))
  82.                     printf("Query  failed. Error - %d\n",serialIO->IOSer.io_Error);
  83.                 else
  84.                     /* Print serial device status - see include file for meaning */
  85.                     /* Note that with DoIO, the Wait and GetMsg are done by Exec */
  86.                     printf("Serial device status: $%x\n\n",serialIO->io_Status);
  87.  
  88.                 serialIO->IOSer.io_Command  = SDCMD_QUERY; /* SendIO - demonstrates asynchronous */
  89.                 SendIO((struct IORequest *)serialIO);      /* device use (returns immediately).  */
  90.  
  91.                 /* We could do other things here while the query is being done.      */
  92.                 /* And to manage our asynchronous device IO:                         */
  93.                 /*   - we can CheckIO(serialIO) to check for completion              */
  94.                 /*   - we can AbortIO(serialIO) to abort the command                 */
  95.                 /*   - we can WaitPort(serialMP) to wait for any serial port reply   */
  96.                 /*  OR we can WaitIO(serialIO) to wait for this specific IO request  */
  97.                 /*  OR we can Wait(1L << serialMP_>mp_SigBit) for reply port signal  */
  98.  
  99.                 Wait(1L << serialMP->mp_SigBit);
  100.  
  101.                 while(reply = (struct IOExtSer *)GetMsg(serialMP))
  102.                 {    /* Since we sent out only one serialIO request the while loop is */
  103.                      /* not really needed--we only expect one reply to our one query  */
  104.                      /* command, and the reply message pointer returned by GetMsg()   */
  105.                      /* will just be another pointer to our one serialIO request.     */
  106.                      /* With Wait() or WaitPort(), you must GetMsg() the message.     */
  107.                     if(reply->IOSer.io_Error)
  108.                         printf("Query  failed. Error - %d\n",reply->IOSer.io_Error);
  109.                     else
  110.                         printf("Serial device status: $%x\n\n",reply->io_Status);
  111.                 }
  112.                 CloseDevice((struct IORequest *)serialIO);  /* Close the serial device.    */
  113.             }
  114.             DeleteExtIO(serialIO);                          /* Delete the I/O request.     */
  115.         }
  116.         else printf("Error: Could create I/O request\n");   /* Inform user that the I/O    */
  117.                                                             /* request could be created.   */
  118.         DeletePort(serialMP);                               /* Delete the message port.    */
  119.     }
  120.     else printf("Error: Could not create message port\n");  /* Inform user that the message*/
  121. }                                                           /* port could not be created.  */
  122.